home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / prg_casm / recio215.zip / RECIO.H < prev    next >
C/C++ Source or Header  |  1996-10-26  |  14KB  |  362 lines

  1. /****************************************************************************
  2.    MODULE: recio.h
  3.   PURPOSE: record input/output header file included in application
  4. COPYRIGHT: (C) 1994-1996, William Pierpoint
  5.   VERSION: 2.15
  6.   RELEASE: October 26, 1996
  7. *****************************************************************************/
  8.  
  9. #ifndef RECIO_H
  10. #define RECIO_H
  11.  
  12. /* include FILE and size_t types */
  13. #ifndef EOF
  14. #include <stdio.h>
  15. #endif
  16.  
  17. /* include struct tm and time_t types */
  18. #ifndef CLOCKS_PER_SEC
  19. #include <time.h>
  20. #endif
  21.  
  22. /* define SIZE_T_MAX */
  23. #ifndef SIZE_T_MAX
  24. #define SIZE_T_MAX (~(size_t)0)
  25. #endif
  26.  
  27. /* structure of REC abstract data type */
  28. typedef struct {
  29.         int      r_fd;       /* descriptor */
  30.         unsigned r_flags;    /* status flags */
  31.         FILE    *r_fp;       /* file pointer */
  32.   const char    *r_fname;    /* pointer to name of file */
  33.         long     r_recno;    /* record number */
  34.         unsigned r_fldno;    /* field number */
  35.         size_t   r_colno;    /* column number */
  36.         size_t   r_recsiz;   /* size of record buffer */
  37.         size_t   r_reclen;   /* length of record buffer */
  38.         char    *r_recp;     /* pointer to record buffer */
  39.         size_t   r_fldsiz;   /* size of field buffer */
  40.         char    *r_fldp;     /* pointer to field buffer */
  41.         int      r_fldch;    /* field separator character */
  42.         int      r_txtch;    /* text delimiter character */
  43.   const char    *r_tmfmt;    /* pointer to time format string */
  44.         int      r_cxtno;    /* context number */
  45. } REC;
  46.  
  47. /* structure of rpos_t abstract data type */
  48. typedef struct {
  49.         int      r_fd;       /* descriptor */
  50.         unsigned r_fldno;    /* field number  */
  51.         size_t   r_colno;    /* column number */
  52.         long     r_recno;    /* record number */
  53. } rpos_t;
  54.  
  55. /* constant expression macros */
  56. #define RECBUFSIZ   80       /* minimum size of record buffer */
  57. #define FLDBUFSIZ   20       /* minimum size of field buffer */
  58. #define RECFLDCH   ' '       /* record field separator character */
  59. #define RECTXTCH   ' '       /* text delimiter character */
  60. #define RECBEGYR  1951       /* year time format %y begins */
  61.  
  62. #define ROPEN_MAX FOPEN_MAX  /* max no of rec streams open at same time */
  63. #define R_READ            0  /* read mode */
  64. #define R_WRITE           1  /* write/append mode */
  65.  
  66. /* operating system dependencies */
  67. #if defined (__MSDOS__) || (MSDOS)
  68. #define R_NREC      4        /* stdin, stdout, stderr, stdprn */
  69. #else
  70. #define R_NREC      3        /* stdin, stdout, stderr */
  71. #endif
  72.  
  73. /* compiler dependencies */
  74. #if defined (__BORLANDC__)
  75. #define NSBUFSIZ    34       /* string buffer sized for ltoa, dtoa, etc */
  76.  
  77. #ifndef TIME_T_MIN
  78. #define TIME_T_MIN  ((time_t)0)
  79. #endif
  80.  
  81. #ifndef TIME_T_MAX
  82. #ifndef LONG_MAX
  83. #include <limits.h>
  84. #endif
  85. #define TIME_T_MAX  ((time_t)LONG_MAX)
  86. #endif
  87.  
  88. #else
  89. #error For this compiler, you need to set:
  90. #error (1) TIME_T_MIN and TIME_T_MAX.  See section 3.5 in file DESIGN.TXT.
  91. #error (2) NSBUFSIZ.  See section 3.6 in file DESIGN.TXT.
  92. #error Also see the file PORTABLE for possible comments on your compiler.
  93. #endif
  94. extern char _r_nsbuf[NSBUFSIZ]; /* numeric to string conversion buffer */
  95.  
  96. /* enumerate errors */
  97. enum {
  98.     R_EDOM=1,                /* argument outside domain */
  99.     R_EINVAL,                /* invalid argument value */
  100.     R_EINVDAT,               /* invalid data */
  101.     R_EINVMOD,               /* invalid read or write mode */
  102.     R_EMISDAT,               /* missing data */
  103.     R_ENOMEM,                /* could not allocate memory */
  104.     R_ENOGET,                /* record length greater than size_t */
  105.     R_ENOPUT,                /* failed put to stream */
  106.     R_ERANGE,                /* data out of range */
  107.     R_EFAULT                 /* unknown error */
  108. };
  109.  
  110. /* enumerate warnings */
  111. enum {
  112.     R_WEMPSTR=1,             /* data string empty */
  113.     R_WNOREG,                /* unable to register function (atexit full) */
  114.     R_WWIDTH,                /* column width too small for data */
  115.     R_WTMFMT,                /* date/time data incomplete */
  116.     R_WFAULT                 /* unknown warning */
  117. };
  118.  
  119. /* define static record streams */
  120. extern REC *recin;           /* recin  record pointer */
  121. extern REC *recout;          /* recout record pointer */
  122. extern REC *recerr;          /* recerr record pointer */
  123. extern REC *recprn;          /* recprn record pointer */
  124.  
  125. #define RECIN       -1       /* recin  context number */
  126. #define RECOUT      -2       /* recout context number */
  127. #define RECERR      -3       /* recerr context number */
  128. #define RECPRN      -4       /* recprn context number */
  129.  
  130. /* record status flags definitions */
  131. #define _R_COL       1       /* beginning column flag (bit 0) */
  132. #define _R_WRT       2       /* read/write stream flag (bit 1) */
  133. #define _R_TXT       4       /* current field text char indicator (bit 2) */
  134. #define _R_EOF     128       /* end-of-file indicator (bit 7) */
  135. #define _R_ERR     256       /* error indicator (bits 8-11) */
  136. #define _R_WRN    4096       /* warning indicator (bits 12-15) */
  137.  
  138. #define _R_ERRMAX   15       /* maximum error number */
  139. #define _R_WRNMAX   15       /* maximum warning number */
  140.  
  141. /* functions implemented as macros */
  142. #define rskipfld(rp)     (rskipnfld((rp), 1))
  143. #define rresetrec(rp)    (rsetrecstr((rp), rrecs(rp)))
  144. #define rnames(rp)       ((rp)->r_fname)
  145. #define rrecs(rp)        ((rp)->r_recp)
  146. #define rflds(rp)        ((rp)->r_fldp)
  147. #define rrecno(rp)       ((rp)->r_recno)
  148. #define rfldno(rp)       ((rp)->r_fldno)
  149. #define rcolno(rp)       ((rp)->r_colno + rbegcolno(rp))
  150. #define rcxtno(rp)       ((rp)->r_cxtno)
  151. #define rbegcolno(rp)    ((rp)->r_flags & _R_COL)
  152. #define ristxtfld(rp)    ((rp)->r_flags & _R_TXT)
  153. #define reof(rp)         ((rp)->r_flags & _R_EOF)
  154.  
  155. #define rgetfldpos(rp, pos)  (_rgetfldpos((rp), &(pos)))
  156. #define rsetfldpos(rp, pos)  (_rsetfldpos((rp), &(pos)))
  157.  
  158. #define rgeti(rp)        (rbgeti( (rp), 10))
  159. #define rgetl(rp)        (rbgetl( (rp), 10))
  160. #define rgetui(rp)       (rbgetui((rp), 10))
  161. #define rgetul(rp)       (rbgetul((rp), 10))
  162. #define rngeti(rp, num)  (rnbgeti((rp), (num), 10))
  163. #define rngetl(rp, num)  (rnbgetl((rp), (num), 10))
  164. #define rngetui(rp, num) (rnbgetui((rp), (num), 10))
  165. #define rngetul(rp, num) (rnbgetul((rp), (num), 10))
  166.  
  167.  
  168. #define rcgeti(rp, begcol, endcol)  (rcbgeti((rp), (begcol), (endcol), 10))
  169. #define rcgetl(rp, begcol, endcol)  (rcbgetl((rp), (begcol), (endcol), 10))
  170. #define rcgetui(rp, begcol, endcol) (rcbgetui((rp), (begcol), (endcol), 10))
  171. #define rcgetul(rp, begcol, endcol) (rcbgetul((rp), (begcol), (endcol), 10))
  172.  
  173. #define rputi(rp, num)   (rbputi((rp), 10, (num)))
  174. #define rputl(rp, num)   (rbputl((rp), 10, (num)))
  175. #define rputui(rp, num)  (rbputui((rp), 10, (num)))
  176. #define rputul(rp, num)  (rbputul((rp), 10, (num)))
  177.  
  178. #define rcputi(rp, begcol, endcol, num)  (rcbputi((rp), (begcol), (endcol), 10, (num)))
  179. #define rcputl(rp, begcol, endcol, num)  (rcbputl((rp), (begcol), (endcol), 10, (num)))
  180. #define rcputui(rp, begcol, endcol, num) (rcbputui((rp), (begcol), (endcol), 10, (num)))
  181. #define rcputul(rp, begcol, endcol, num) (rcbputul((rp), (begcol), (endcol), 10, (num)))
  182.  
  183. #define strimbegs(str)           (scntrimbegs((str), ' ', SIZE_T_MAX))
  184. #define strimends(str)           (scntrimends((str), ' ', SIZE_T_MAX))
  185. #define strims(str)              (scntrims((str), ' ', SIZE_T_MAX))
  186. #define sctrimbegs(str, ch)      (scntrimbegs((str), (ch), SIZE_T_MAX))
  187. #define sctrimends(str, ch)      (scntrimends((str), (ch), SIZE_T_MAX))
  188. #define sctrims(str, ch)         (scntrims((str), (ch), SIZE_T_MAX))
  189. #define scpys(dst, src)          (_scpys(&(dst), (src)))
  190. #define scats(dst, src)          (_scats(&(dst), (src)))
  191.  
  192. #ifdef __cplusplus
  193. extern "C" {
  194. #endif
  195.  
  196. /* function prototypes */
  197. /* source: recio.c */
  198. extern void  rclose(REC *rp);
  199. extern int   rcloseall(void);
  200. extern int   risvalid(REC *rp);
  201. extern REC  *ropen(const char *filename, const char *mode);
  202. extern void  rsetbegcolno(REC *rp, int colno);
  203. extern void  rsetcxtno(REC *rp, int cxtno);
  204. extern void  rsetfldch(REC *rp, int ch);
  205. extern void  rsettmfmt(REC *rp, const char *fmt);
  206. extern void  rsettxtch(REC *rp, int ch);
  207.  
  208. /* source: rerr.c */
  209. extern void  rclearerr(REC *rp);
  210. extern int   rerror(REC *rp);
  211. extern char *rerrstr(REC *rp);
  212. extern int   rseterr(REC *rp, int errnum);
  213. extern void  rseterrfn(void(*rerrfn)(REC *rp));
  214. extern char *rstrerror(int errnum);
  215. extern void  rinit(void(*rerrfn)(REC *rp), void(*rwarnfn)(REC *rp));
  216.  
  217. /* source: remsg.c */
  218. extern void rerrmsg(REC *rp);
  219.  
  220. /* source: rwarn.c */
  221. extern void  rclearwarn(REC *rp);
  222. extern int   rwarning(REC *rp);
  223. extern char *rwarnstr(REC *rp);
  224. extern int   rsetwarn(REC *rp, int warnum);
  225. extern void  rsetwarnfn(void(*rwarnfn)(REC *rp));
  226. extern char *rstrwarning(int warnum);
  227.  
  228. /* source: rwmsg.c */
  229. extern void rwarnmsg(REC *rp);
  230.  
  231. /* source: rget.c */
  232. extern char    *rgetrec(REC *rp);
  233. extern void     _rgetfldpos(REC *rp, rpos_t *pos);
  234. extern void     _rsetfldpos(REC *rp, const rpos_t *pos);
  235. extern void     rsetfldsiz(REC *rp, size_t fldsize);
  236. extern void     rsetfldstr(REC *rp, const char *s);
  237. extern void     rsetrecsiz(REC *rp, size_t recsize);
  238. extern void     rsetrecstr(REC *rp, const char *s);
  239. extern void     rskipnfld(REC *rp, unsigned num);
  240. extern void     rgotofld(REC *rp, unsigned num);
  241. extern unsigned rnumfld(REC *rp);
  242.  
  243. /* source: rgetf.c */
  244. extern float  rgetf(REC *rp);
  245. extern double rgetd(REC *rp);
  246. extern float  rngetf(REC *rp, unsigned num);
  247. extern double rngetd(REC *rp, unsigned num);
  248.  
  249.  
  250. /* source: rgets.c */
  251. extern int    rgetc(REC *rp);
  252. extern char  *rgets(REC *rp);
  253. extern int    rngetc(REC *rp, unsigned num);
  254. extern char  *rngets(REC *rp, unsigned num);
  255.  
  256.  
  257. /* source: rgett.c */
  258. extern time_t    rgett(REC *rp);
  259. extern struct tm rgettm(REC *rp);
  260. extern time_t    rngett(REC *rp, unsigned num);
  261. extern struct tm rngettm(REC *rp, unsigned num);
  262. extern time_t    sftotime(const char *s, const char *fmt);
  263. extern struct tm sftotm(const char *s, const char *fmt);
  264. extern time_t    tmtotime(struct tm);
  265. extern struct tm timetotm(time_t);
  266. extern void      rsetbegyr(int year);
  267.  
  268. /* source: rbget.c */
  269. extern int           rbgeti( REC *rp, int base);
  270. extern unsigned int  rbgetui(REC *rp, int base);
  271. extern long          rbgetl( REC *rp, int base);
  272. extern unsigned long rbgetul(REC *rp, int base);
  273. extern int           rnbgeti( REC *rp, unsigned num, int base);
  274. extern unsigned int  rnbgetui(REC *rp, unsigned num, int base);
  275. extern long          rnbgetl( REC *rp, unsigned num, int base);
  276. extern unsigned long rnbgetul(REC *rp, unsigned num, int base);
  277.  
  278.  
  279. /* source: rcgetf.c */
  280. extern float  rcgetf(REC *rp, size_t begcol, size_t endcol);
  281. extern double rcgetd(REC *rp, size_t begcol, size_t endcol);
  282.  
  283. /* source: rcgets.c */
  284. extern int    rcgetc(REC *rp, size_t col);
  285. extern char  *rcgets(REC *rp, size_t begcol, size_t endcol);
  286.  
  287. /* source: rcgett.c */
  288. extern time_t    rcgett(REC *rp, size_t begcol, size_t endcol);
  289. extern struct tm rcgettm(REC *rp, size_t begcol, size_t endcol);
  290.  
  291. /* source: rcbget.c */
  292. extern int           rcbgeti( REC *rp, size_t begcol, size_t endcol, int base);
  293. extern unsigned int  rcbgetui(REC *rp, size_t begcol, size_t endcol, int base);
  294. extern long          rcbgetl( REC *rp, size_t begcol, size_t endcol, int base);
  295. extern unsigned long rcbgetul(REC *rp, size_t begcol, size_t endcol, int base);
  296.  
  297. /* source: rput.c */
  298. extern void rputrec(REC *rp);
  299.  
  300. /* source: rputf.c */
  301. extern void rputf(REC *rp, float f);
  302. extern void rputd(REC *rp, double d);
  303.  
  304. /* source: rputs.c */
  305. extern void rputc(REC *rp, int ch);
  306. extern void rputs(REC *rp, const char *str);
  307.  
  308. /* source: rputt.c */
  309. extern void rputt(REC *rp, time_t time);
  310. extern void rputtm(REC *rp, struct tm t);
  311.  
  312. /* source: rbput.c */
  313. extern void rbputi(REC *rp, int base, int i);
  314. extern void rbputui(REC *rp, int base, unsigned int ui);
  315. extern void rbputl(REC *rp, int base, long l);
  316. extern void rbputul(REC *rp, int base, unsigned long ul);
  317.  
  318. /* source: rcputs.c */
  319. extern void rcputc(REC *rp, size_t col, int ch);
  320. extern void rcputs(REC *rp, size_t begcol, size_t endcol, const char *str);
  321.  
  322. /* source: rcputf.c */
  323. extern void rcputf(REC *rp, size_t begcol, size_t endcol, float f);
  324. extern void rcputd(REC *rp, size_t begcol, size_t endcol, double d);
  325.  
  326. /* source: rcputt.c */
  327. extern void rcputt(REC *rp, size_t begcol, size_t endcol, time_t time);
  328. extern void rcputtm(REC *rp, size_t begcol, size_t endcol, struct tm t);
  329.  
  330. /* source: rcbput.c */
  331. extern void rcbputi(REC *rp, size_t begcol, size_t endcol, int base, int i);
  332. extern void rcbputui(REC *rp, size_t begcol, size_t endcol, int base, unsigned int ui);
  333. extern void rcbputl(REC *rp, size_t begcol, size_t endcol, int base, long l);
  334. extern void rcbputul(REC *rp, size_t begcol, size_t endcol, int base, unsigned long ul);
  335.  
  336. /* source: rfix.c */
  337. extern void rbfixi( REC *rp, int base);
  338. extern void rbfixui(REC *rp, int base);
  339. extern void rbfixl( REC *rp, int base);
  340. extern void rbfixul(REC *rp, int base);
  341. extern void rfixc(REC *rp);
  342. extern void rfixf(REC *rp);
  343. extern void rfixd(REC *rp);
  344. extern void rfixi(REC *rp);
  345. extern void rfixl(REC *rp);
  346. extern void rfixt(REC *rp);
  347. extern void rfixui(REC *rp);
  348. extern void rfixul(REC *rp);
  349.  
  350. /* source: rstr.c */
  351. extern char *scntrimbegs(char *str, int ch, size_t num);
  352. extern char *scntrimends(char *str, int ch, size_t num);
  353. extern char *scntrims(char *str, int ch, size_t num);
  354. extern char *_scpys(char **dst, const char *src);
  355. extern char *_scats(char **dst, const char *src);
  356.  
  357. #ifdef  __cplusplus
  358. }
  359. #endif
  360.  
  361. #endif
  362.